package com.tom.baselibrary.navigationbar;

import android.app.Activity;
import android.content.Context;
import android.graphics.drawable.ColorDrawable;
import android.text.TextUtils;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;

import androidx.core.content.ContextCompat;

/**
 * Added by Tom on 2024/06/26.
 * 头部Builder 的基类。MVC
 * 泛型P的使用
 */
public abstract class AbsNavigationBar<P extends AbsNavigationBar.Builder.AbsNavigationParams>
        implements INavigationBar {

    private P mParams; // 信息Bean
    private View mNavigationView;

    public AbsNavigationBar(P params) {
        this.mParams = params;
        createAndBindView(); // 绑定和创建view
    }
    protected String getString(int id) {
        return this.mParams.mContext.getResources().getString(id);
    }

    protected int getColor(int id) {
        return ContextCompat.getColor(this.mParams.mContext, id);
    }
    // 获取参数
    public P getParams() {
        return mParams;
    }
    /**
     * 设置文本
     * @param viewId
     * @param text
     */
    protected void setText(int viewId, CharSequence text) {
        TextView tv = findViewById(viewId);
        if (tv != null && !TextUtils.isEmpty(text)) {
            tv.setText(text);
        }
    }
    // 设置控件隐藏。
    protected void setVisibility(int viewId, int visibility) {
        findViewById(viewId).setVisibility(visibility);
    }

    /**
     * 设置点击事件
     * @param viewId
     * @param listener
     */
    protected void setOnClickListener(int viewId, View.OnClickListener listener) {
        View view = findViewById(viewId);
        if (view != null ) {
            view.setOnClickListener(listener);
        }
    }


    /**
     * 设置背景资源
     * @param viewId
     * @param resourceId
     */
    protected void setImageResource(int viewId, int resourceId) {
        ImageView imageView = findViewById(viewId);
        if (imageView != null) {
            imageView.setImageResource(resourceId);
        }
    }

    protected void setBackgroundColor(int viewId, int color) {
        View root = mNavigationView.findViewById(viewId);
        mNavigationView.setBackgroundColor(color);
    }

    protected <T extends View> T findViewById(int id) {
        return (T) mNavigationView.findViewById(id);
    }

    // 绑定和创建view
    private void createAndBindView() {
        // 未给Activity设置id（android:id="@+id/view_group"）
        if (mParams.mParent == null) {
            // 获取Activity的根布局（是否是LinearLayout）。继承自AppCompatActivity。
            // 方案1：根布局一定要是LinearLayout
            // ViewGroup activityRoot = ((Activity) mParams.mContext).findViewById(android.R.id.content);
            // 方案2：根布局可以是RelativeLayout
            ViewGroup activityRoot = (ViewGroup)((Activity) mParams.mContext).getWindow().getDecorView(); // Decor: FrameLayout
            mParams.mParent = (ViewGroup) activityRoot.getChildAt(0); // DecorView的第0个位置，是系统资源布局-> LinearLayout
            Log.d("TAG0626", "" + mParams.mParent); // android.widget.LinearLayout
        }
        // TODO：处理继承自Activity，的View源码部分。
        if (mParams.mParent == null) return;

        // 1. 创建view.bindLayoutId()调用子类实现的方法(抽象方法)，获取到布局id。
        mNavigationView = LayoutInflater.from(mParams.mContext)
                .inflate(bindLayoutId(), mParams.mParent, false);
        // 2.方案1，添加 到LinearLayout第0个位置。mParent 就是activity_main.xml 根布局
        // 方案2，mParent 是系统 LinearLayout
        mParams.mParent.addView(mNavigationView, 0);
        // 3. 绑定参数
        applyView();
    }

    // 内部抽象类。静态类里面还有静态类。
    // Builder: AbsNavigationBar, Builder, Params
    public abstract static class Builder {
        private Context context;
        private ViewGroup parent; // 最终创建的view，加到布局里面。往哪里添加
        public Builder(Context context, ViewGroup parent) {
            // 创建P
            this.context = context;
            this.parent = parent;
        }
        public abstract AbsNavigationBar builder(); // 构建对象

        public static class AbsNavigationParams {
            public Context mContext;
            public ViewGroup mParent;

            public AbsNavigationParams(Context context, ViewGroup parent) {
                this.mContext = context;
                this.mParent = parent;
            }
        }
    }

}
